# -*- coding: utf-8 -*-

from plugmgr import plugin

__all__ = ['pmanager']

class pmanager(plugin):
    requires = ['cmd','lang']
    export = ['load','unload','reload']
    def __init__(self, bot):
        self.bot = bot
        for c in self.export:
            self.bot["cmd"].addHandler(c, eval('self._%s'%c),100)
    def unload(self):
        for c in self.export:
            self.bot["cmd"].removeHandler(c)
    def manage(self,c,action):
        self.bot.plugmgr.refresh() # TODO: с одной стороны, данные команды вызываются не столь часто, ибо у них своя специфика, но, с другой стороны, если плагинов будет очень много... // ..то можно будет сделать отдельную команду "refresh"
        def reload(p,recursive):
            # raise NotImplementedError, 'Not implemented yet'
            u = self.bot.plugmgr.unload(p,recursive)
            for p in u:
                try:              self.bot.plugmgr.load(p,recursive)
                except NameError: pass
            return u
        actions = {
            'load':   self.bot.plugmgr.load,
            'unload': self.bot.plugmgr.unload,
            'reload': reload
        }
        try:
            plugin = c.args.strip() # failed when plugin is None
            if not plugin: raise Exception
        except:
            c.reply(c._('Failed.'))
            return
        if plugin=='pmanager':
            c.reply(c._('Don\'t touch me! >:|')) # TODO: but you can unload pmanager, i. e. with `unload cmd` command
            return
        try:    mentioned = actions[action](plugin,True) # TODO: может, дать возможность управлять возможностью управлять слежением за зависимостями?
        except: c.err()
        else:
            mentioned.sort()
            c.reply(c._('Mentioned plugins (%s): %s')%(len(mentioned),', '.join(mentioned)))
    def _load(self,c):
        '''
        @plugmgr
        Loads plugin with dependences
        '''
        self.manage(c,'load')
    def _unload(self,c):
        '''
        @plugmgr
        Unloads plugin with dependences
        '''
        self.manage(c,'unload')
    def _reload(self,c):
        '''
        @plugmgr
        Reloads plugin with dependences
        '''
        self.manage(c,'reload')

